大家好,我是Leo
今天要來講解是如何透過API啟動一分鐘後的TASK任務
OK~~~ Let's go now!!!
首先我們有一個任務如下,return finish + 參數id
@shared_task()
def get_id(id):
return 'finish:' + str(id)
這邊時區可以因應設置的celery的時區,我這邊是台北時區
import requests,os,pytz,datetime
from website.tasks import get_id
from celery import Celery
from rest_framework.response import Response
from rest_framework import permissions, views, status
class testAsyncTask(views.APIView):
permission_classes = (permissions.AllowAny,)
authentication_classes = []
def post(self,request):
id = request.data.get('id')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
app = Celery("mysite")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
local_timezone = pytz.timezone("Asia/Taipei")
now = datetime.datetime.now()
# 60秒後執行
exec_time = now + datetime.timedelta(seconds=60)
# 利用 pytz 進行轉換
exec_time = local_timezone.localize(exec_time)
#apply_async 異步執行,多進程安排執行任務,eta時間差,這邊是60秒後執行
get_id.apply_async(args=(id,), eta=exec_time)
return Response( {"success": True, "message": "執行成功"}, status=status.HTTP_200_OK)
path('api/testTask',csrf_exempt(testAsyncTask.as_view()),name='api-testTask'),
很重要記得要先啟動celery,不然任務不會執行也不會啟動
celery -A mysite beat
# 這邊concurrency 選擇自己要執行的cpu核心數
Celery -A mysite worker --concurrency=4 -l info -P eventlet
看到畫面恭喜執行成功
為什麼要執行多進程的異步方法呢?
每當我們執行api,任務就會佇列在任務時程上面
等到時間到,就會執行呼叫相關的任務內容
與此同時API不會因為任務還沒執行而一直處於等待的階段
今天主要講解執行API來達成多進程異步任務的佇列,接下來我們來講解Redis的快取使用方式
我們明天見,各位掰掰~~~